/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.isystem.autpart.controller;


import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.isystem.autpart.beans.TClaseArticulo;
import org.isystem.autpart.dao.DAO;
import org.isystem.autpart.util.idNew;
import org.zkoss.bind.ValidationContext;
import org.zkoss.bind.Validator;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.bind.validator.AbstractValidator;
import org.zkoss.zul.DefaultTreeModel;
import org.zkoss.zul.DefaultTreeNode;
/**
 *
 * @author miguel-lap
 */
public class ManagerAdmClaseArticulo {
    
    private static final long serialVersionUID = 1L;
    private List<TClaseArticulo> clasesArticulo; //claseArticulos
    private List<TClaseArticulo> clasesPadre; //clasesPadre
    private TClaseArticulo claseArticulo = new TClaseArticulo(); //claseArticulo
    private TClaseArticulo claseArtSelected = new TClaseArticulo(); //claseArticuloSelected
    private DefaultTreeNode cATSelected; //claseArticuloSelected
    private DAO dao = new DAO();
    private boolean verSave;
    private boolean mostrarAdd;
    private String saveLabel;
    private String buscar;
    private String val="";
    
    private Session s;
    //tree
//    private TreeModel<TreeNode<TClaseArticulo>> clasTree;
    DefaultTreeModel clasTreeModel;
    DefaultTreeNode clasTreeNode;
    
    //validators
    
    //validation messages
    Map<String, String> validationMessages = new HashMap<String,String>();
    
    @Init
    public void init(){
        System.out.println("Inicia AdminClaseArticulo");
        s = dao.getSession();
        actualizaListaClasesArticulo(s, "");
        mostrarAdd = false;
    }
    
    //Validators
    public Validator getFormValidator(){
        System.out.println("validator all");
        return new AbstractValidator() {
//            private HashMap validationMessages;

            public void validate(ValidationContext ctx) {
// Consultar si es persona natural o juridica
                String val = (String)ctx.getProperties("denominacion")[0].getValue();
                System.out.println("denominacion "  + val);
//                ValidationMessages vmsgs = (ValidationMessages) ctx.getValidatorArg("vmsgs");
//                validationMessages.put("usuarioTextBox", "value1 error");
//                ctx.setInvalid(); // mark invalid
//                ValidationMessages vmsgs = ((BinderCtrl)ctx.getBindContext().getBinder()).getValidationMessages();
//                addInvalidMessage(ctx, "usuario", "value1 error");
//                System.out.println("111");
//                ctx.getBindContext().getBinder().notifyChange(validationMessages, "usuarioTextBox");
//                if(invalidCondition01(val)){
//                    addInvalidMessage(ctx, "fkey1", "value1 error");
//                }
//                val = (String)ctx.getProperties("value2")[0].getValue();
//                if(invalidCondition02(val)){
//                    addInvalidMessage(ctx, "fkey2", "value2 error");
//                }
//                val = (String)ctx.getProperties("value3")[0].getValue();
//                if(invalidCondition03(val)){
//                    addInvalidMessage(ctx, "fkey3", "value3 error");
//                }
//                ctx.getBindContext().getBinder().notifyChange(validationMessages, "usuarioTextBox");
                
                
            }
        };
    }
    
    // botones
    @Command
    @NotifyChange({"verSave","claseArticulo","mostrarAdd","saveLabel","clasesPadre","val"})
    public void onClickadd() {
        System.out.println("click en agregar");
        claseArticulo = new TClaseArticulo();
        actualizaListaClasPadres(s, "");
        mostrarAdd = true;
        verSave = true;
        val="";
        saveLabel ="Guardar";
    }
    
    @Command
    @NotifyChange({"clasesArticulo", "buscar","clasTreeModel"})
    public void onClickSearch() {
        System.out.println("click search");
        actualizaListaClasesArticulo(s, " and c.denominacion like '%"+buscar+"%'");
    }
    
    @NotifyChange({"claseArticulo","verSave","clasesArticulo","val","clasTreeModel"})
    @Command()
    public void guardar() {
        System.out.println("guardar");
        //Asignacion de IDs
        if (saveLabel.equals("Guardar")) {
            //Asignacion de IDs
            claseArticulo.setId(idNew.id());
        } else {
            if ((val.equals("")) && (claseArticulo.getTClaseArticulo() == null)){
                claseArticulo.setTClaseArticulo(null);
            }
        }
        Transaction tr = s.beginTransaction();
        tr.begin();
        dao.persist(s, claseArticulo);
        tr.commit();
        verSave = false;
        actualizaListaClasesArticulo(s, "");
        System.out.println("fin guarda");
        return;
    }
    
    @NotifyChange({"verSave","claseArticulo","mostrarAdd","saveLabel","clasesPadre", "val","clasTreeModel"})
    @Command()
    public void edita(@BindingParam("clasArN") DefaultTreeNode ca ) {
        System.out.println("editar");
        verSave = true;
        claseArticulo = new TClaseArticulo();   
        TClaseArticulo selec =  new TClaseArticulo();
        selec = (TClaseArticulo) ca.getData();
        claseArticulo = (TClaseArticulo) dao.load(s, TClaseArticulo.class, selec.getId()+"");
        val="";
        actualizaListaClasPadres(s, " where c.denominacion != '"+claseArticulo.getDenominacion()+"'");
        mostrarAdd = true;
        saveLabel = "Modificar";

    }
    @Command
    @NotifyChange({"verSave","claseArticulo","mostrarAdd","saveLabel","clasesPadre","val"})
    public void agrega(@BindingParam("clasArN") DefaultTreeNode ca) {
        System.out.println("click en agregar");
        claseArticulo = new TClaseArticulo();
        TClaseArticulo selec =  new TClaseArticulo();
        selec = (TClaseArticulo) ca.getData();
        claseArticulo.setTClaseArticulo((TClaseArticulo) dao.load(s, TClaseArticulo.class, selec.getId()+""));
        val="";
        actualizaListaClasPadres(s, "");
        mostrarAdd = true;
        verSave = true;
        saveLabel ="Guardar";
    }
    
    @NotifyChange({"claseArticulo","mostrarAdd","saveLabel","clasesArticulo","clasTreeModel"})
    @Command()
    public void elimina(@BindingParam("clasArN") DefaultTreeNode ca ) {
        System.out.println("eliminar");
        claseArticulo = (TClaseArticulo) ca.getData();
        Transaction tr = s.beginTransaction();
        tr.begin();
        dao.delete(s, claseArticulo);
        tr.commit();
        mostrarAdd = false;
        actualizaListaClasesArticulo(s, "");
    }
    
    // Change Selected
    @NotifyChange({"claseArticulo","verSave","mostrarAdd","clasesPadre","claseArticuloSelected","val"})
    @Command()
    public void selecciona() {
        System.out.println("Selecciona Categoria");
        verSave = false;
        claseArticulo = new TClaseArticulo();
        clasesPadre = new LinkedList<TClaseArticulo>();
        val = "";
        actualizaListaClasPadres(s, " where c.denominacion != '"+claseArtSelected.getDenominacion()+"'");
        claseArticulo = (TClaseArticulo) cATSelected.getData();
        mostrarAdd = true;
    }
    
    
    @Command()
    public void selecClasPadre() {
        System.out.println("Selecciona Clase Articulo Padre");
    }

    
    // Metodos
    private void actualizaListaClasesArticulo(Session s, String sql) {
        clasesArticulo = new LinkedList<TClaseArticulo>();
        clasesArticulo.clear();
  
        DefaultTreeNode<TClaseArticulo> root = new DefaultTreeNode("Root", new DefaultTreeNode[] {});
        s.clear();
        clasesArticulo = dao.findAll(s, "from TClaseArticulo c where c.TClaseArticulo is null " + sql);   
        for (TClaseArticulo claseArtPadre : clasesArticulo) {
            DefaultTreeNode nPadre = new DefaultTreeNode(claseArtPadre, new DefaultTreeNode[] {});
            llenaArbol(claseArtPadre, nPadre);
            root.add(nPadre);
        }

        clasTreeModel = new DefaultTreeModel<TClaseArticulo>(root);
    }
    
    public void llenaArbol(TClaseArticulo padre, DefaultTreeNode padreTree) {
        List<TClaseArticulo> listArtChi = new LinkedList<TClaseArticulo>();
        listArtChi.addAll(padre.getTClaseArticulos());
        System.out.println(padre.getDenominacion() + "--");
        for (TClaseArticulo hijo : listArtChi) {
            DefaultTreeNode hijoTree = new DefaultTreeNode(hijo, new DefaultTreeNode[]{});
            padreTree.add(hijoTree);
            System.out.println("- - " + hijo.getDenominacion());
            llenaArbol(hijo,hijoTree);
        }
    }
    
    private void actualizaListaClasPadres(Session s, String sql) {
        clasesPadre = new LinkedList<TClaseArticulo>();
        clasesPadre.clear();
        clasesPadre = dao.findAll(s, "from TClaseArticulo c" + sql);
    }

    public List<TClaseArticulo> getClasesArticulo() {
        return clasesArticulo;
    }

    public void setClasesArticulo(List<TClaseArticulo> clasesArticulo) {
        this.clasesArticulo = clasesArticulo;
    }

    public List<TClaseArticulo> getClasesPadre() {
        return clasesPadre;
    }

    public void setClasesPadre(List<TClaseArticulo> clasesPadre) {
        this.clasesPadre = clasesPadre;
    }


    public TClaseArticulo getClaseArticulo() {
        return claseArticulo;
    }

    public void setClaseArticulo(TClaseArticulo claseArticulo) {
        this.claseArticulo = claseArticulo;
    }

    public TClaseArticulo getClaseArtSelected() {
        return claseArtSelected;
    }

    public void setClaseArtSelected(TClaseArticulo claseArtSelected) {
        this.claseArtSelected = claseArtSelected;
    }

    public boolean isVerSave() {
        return verSave;
    }

    public void setVerSave(boolean verSave) {
        this.verSave = verSave;
    }

    public boolean isMostrarAdd() {
        return mostrarAdd;
    }

    public void setMostrarAdd(boolean mostrarAdd) {
        this.mostrarAdd = mostrarAdd;
    }

    public String getSaveLabel() {
        return saveLabel;
    }

    public void setSaveLabel(String saveLabel) {
        this.saveLabel = saveLabel;
    }

    public String getBuscar() {
        return buscar;
    }

    public void setBuscar(String buscar) {
        this.buscar = buscar;
    }

    public String getVal() {
        return val;
    }

    public void setVal(String val) {
        this.val = val;
    }

    public Map<String, String> getValidationMessages() {
        return validationMessages;
    }

    public void setValidationMessages(Map<String, String> validationMessages) {
        this.validationMessages = validationMessages;
    }

    public DefaultTreeModel getClasTreeModel() {
        return clasTreeModel;
    }

    public void setClasTreeModel(DefaultTreeModel clasTreeModel) {
        this.clasTreeModel = clasTreeModel;
    }

    public DefaultTreeNode getClasTreeNode() {
        return clasTreeNode;
    }

    public void setClasTreeNode(DefaultTreeNode clasTreeNode) {
        this.clasTreeNode = clasTreeNode;
    }

    public DefaultTreeNode getcATSelected() {
        return cATSelected;
    }

    public void setcATSelected(DefaultTreeNode cATSelected) {
        this.cATSelected = cATSelected;
    }


}

